/*
 * LIST.C Version 1.01 (C)1996 HUDSON SOFT
 * MIX 再生サンプルプログラム ファイルリスト制御(LIST.C)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mixplay.h"

filelist far *file_list_top = NULL;

/* ファイルリストに追加します。
 *
 * 入力
 * char		    *name  追加ファイル名
 *
 * 出力
 * なし
 */
void add_file_list(char *name)
{
    unsigned long l,ln;
    filelist far *lp,far *gp;
    char mesbuf[256];
    if (!file_exist_check(name)) {
	sprintf(mesbuf,"ファイル(%s)が見つかりません",name);
	error(mesbuf);
    }
    ln = sizeof(filelist) + strlen(name);
    if ((gp = my_malloc(ln)) == NULL) error("メモリが足りません");
    l = get_file_size(name);
    gp->next = NULL;
    gp->lsize = (l + 2047L) & 0xfffff800;
    if (!gp->lsize) gp->lsize = 2048;
    gp->psize = l;
    gp->sec_len = gp->lsize >> 11;
    gp->type = 0x04;
    _fstrcpy(gp->name,(char far *)name);
    if (file_list_top) {
	lp = file_list_top;
	while (lp->next != NULL) lp = lp->next;
	lp->next = gp;
	gp->sec_top = lp->sec_end + 1;
	gp->sec_end = gp->sec_top + gp->sec_len - 1;
	gp->track = lp->track + 1;
    } else {
	file_list_top = gp;
	gp->sec_top = 0;
	gp->sec_end = gp->sec_len - 1;
	gp->track = 1;
    }
}

/* ファイルリストを開放します。
 *
 * 入力
 * なし
 *
 * 出力
 * なし
 */
void free_file_list(void)
{
    filelist far *p0,far *p1;
    for(p0 = file_list_top;p0;) {
	p1 = p0->next;
	my_free(p0);
	p0 = p1;
    }
    file_list_top = NULL;
}

/* 指定したセクタを含むファイルリストのポインタを求めます。
 *
 * 入力
 * unsigned long    sec    セクタ位置
 *
 * 出力
 * filelist far *   NULL   リストの範囲外
 *		    上記外 リストのポインタ
 */
filelist far *get_sec_list(unsigned long sec)
{
    filelist far *p;
    for (p = file_list_top;p;) {
	if ((sec >= p->sec_top) && (sec <= p->sec_end)) break;
	p = p->next;
    }
    return(p);
}

/* 指定したトラックに対するファイルリストのポインタを求めます。
 *
 * 入力
 * int		    trk    トラック番号
 *
 * 出力
 * filelist far *   NULL   リストの範囲外
 *		    上記外 リストのポインタ
 */
filelist far *get_track_list(int trk)
{
    filelist far *p;
    for (p = file_list_top;p;) {
	if (trk == p->track) break;
	p = p->next;
    }
    return(p);
}
